/// thread study
/// 线程（thread）是一个程序中独立运行的一个部分。

use std::thread;
use std::time::Duration;
use std::sync::mpsc;
// 通过 std::thread::spawn 函数创建新线程
pub fn call_thread_func(){
    let h =thread::spawn(||{
        for i in 0..5 {
            println!("spawned thread print {}", i);
            thread::sleep(Duration::from_secs(1));
        }
    });
    // join 方法可以使子线程运行结束后再停止运行程序。
    h.join().unwrap();
}

// move 强制所有权迁移
pub fn move_all(){
    let s = "hello";
    //可以使用闭包的 move 关键字来处理
    let handle = thread::spawn(move|| {
        // 在子线程中尝试使用当前函数的资源，这一定是错误的
        println!("{}", s);
    });
    handle.join().unwrap()
}

// channel传递
pub fn msg_channel(){
    let (tx, rx) = mpsc::channel();
    thread::spawn(move || {
        let val = String::from("hi");
        tx.send(val).unwrap();
    });

    let received = rx.recv().unwrap();
    println!("Got: {}", received);
}

